#ifndef __LEOS_TIMER_H__
#define __LEOS_TIMER_H__

#include "leos_list.h"

/* timer config */
#include "leos_hw.h"
#define LE_TIMER_ENTER_CRITICAL \
            unsigned long level = le_hw_interrupt_disable()

#define LE_TIMER_EXIT_CRITICAL \
            le_hw_interrupt_enable(level)

typedef unsigned long long      le_tick_t;

#define LE_TIMER_FLAG_STOP      0x00
#define LE_TIMER_FLAG_ACTIVE    0x01

struct le_timer {
    unsigned char   flag;
    le_list_t       list;
    le_tick_t       timeout_tick;
    void           *parameter;
    void (*timeout_cb)(void *parameter);
};

typedef struct le_timer *le_timer_t;

void le_timer_init(le_timer_t timer, 
                   void (*timeout_cb)(void *parameter),
                   void *parameter);
void le_timer_start(le_timer_t timer, le_tick_t timeout_tick);
void le_timer_stop(le_timer_t timer);
void le_timer_check(le_tick_t current_tick);

le_tick_t le_tick_get(void);
void le_tick_increase(void);

#endif
